/*
* Copyright (C) 2019 ~ 2022 Uniontech Software Technology Co.,Ltd.
*
* Author:     yanghongwei <yanghongwei@uniontech.com>
*
* Maintainer: yanghongwei <yanghongwei@uniontech.com>
*/

#ifndef ABSTRACT_NOTIFY_PROCESS_H
#define ABSTRACT_NOTIFY_PROCESS_H

#include "common.h"

#include <string>
#include <list>

/**
 * @brief 这个类是一个基类，需要用户去继承实现具体的业务的子类
 */
class AbstractNotifyProcess
{
public:
    AbstractNotifyProcess();
    virtual ~AbstractNotifyProcess();

    /**
     * @brief 事件通知回调函数
     * @param opTime 事件发生事件
     * @param file 文件全路径
     * @param process 操作文件的进程名称
     * @param events 文件操作事件
     * @return true:fanotify PERM操作允许  false:fanotify PERM操作阻断
     * @note 该回调接口在其它线程被调用。需要注意多线程数据竞争
     */
    virtual bool notifyCallBackFun(uint64_t opTime, std::string file, std::string process, uint32_t events);

    /**
     * @brief 注册事件通知回调
     * @return 注册成功返回true，否则返回false
     */
    bool registeredCallBack();
    /**
     * @brief 取消注册事件通知回调
     * @return 取消成功返回true，否则返回false
     * @note 取消注册前先移除所监听的事件
     */
    bool unRegisteredCallBack();
    /**
     * @brief 添加一个要监听的节点
     * @param node 监听的节点
     * @return 添加成功返回true,否则返回false
     */
    bool addNode(const NotifyNode &node);
    // TODO: 目前移除操作存在问题，如果别的process添加相同的监测路径，一个移除，就会导致其它的也将不会收到需要的事件
    /**
     * @brief 移除一个监听的节点
     * @param node 监听的节点
     * @return 移除成功返回true,否则返回false
     */
    bool removeNode(const NotifyNode &node);

public:
    NotifyType notifyType; // 该业务属于inotify还是fanotify
};

#endif //ABSTRACT_NOTIFY_PROCESS_H
